package com.webware.one.server.dao;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.webware.one.server.domain.User;
import com.webware.one.server.domain.UserCredentials;
import com.webware.one.shared.dto.UserDto;
import com.webware.one.shared.exception.AnyServiceException;
import com.webware.one.shared.exception.ValidationException;

@Repository
public class UserDao extends AbstractDao<User> {

    @Override
    public Class<User> getEntityClass() {
	return User.class;
    }

    public User findByLogin(String login) {
	if (login == null)
	    return null;
	try {
	    login = login.trim().toLowerCase();
	    Query q = em
		    .createQuery("SELECT u FROM User u JOIN u.credentials c WHERE c.login = :login");
	    q.setParameter("login", login);
	    return (User) q.getSingleResult();
	} catch (Exception e) {
	    return null;
	}
    }

    @Transactional
    public User save(UserDto bean) throws AnyServiceException {
	if (bean.getFio() != null && bean.getFio().length() > 1024)
	    throw new ValidationException(
		    "Длина атрибут 'Полное имя' превышает максимальное значение 1024 символа");
	if (bean.getEmail() != null && bean.getEmail().length() > 1024)
	    throw new ValidationException(
		    "Длина атрибут 'e-mail' превышает максимальное значение 1024 символа");
	if (bean.getPosition() != null && bean.getPosition().length() > 1024)
	    throw new ValidationException(
		    "Длина атрибут 'Должность' превышает максимальное значение 1024 символа");
	if (bean.getPosition() != null && bean.getPosition().length() > 1024)
	    throw new ValidationException(
		    "Длина атрибут 'Должность' превышает максимальное значение 1024 символа");
	if (bean.getLogin() != null && bean.getLogin().length() > 255)
	    throw new ValidationException(
		    "Длина атрибут 'Логин' превышает максимальное значение 255 символов");

	if (bean.getId() == null && findByLogin(bean.getLogin()) != null)
	    throw new ValidationException(
		    "Пользователь с таким логином уже существует");

	User entity = null;
	if (bean.getId() != null) {
	    entity = (User) findById(bean.getId());
	    if (entity == null)
		throw new AnyServiceException(
			"Изменяемый пользователь не найден в базе");
	} else {
	    entity = new User();
	}

	persist(entity);

	return entity;
    }

    @Transactional
    public User save(UserDto bean, String password) throws AnyServiceException {
	if (password != null && password.length() > 255)
	    throw new ValidationException(
		    "Длина атрибут 'Пароль' превышает максимальное значение 255 символов");

	User entity = save(bean);

	if (!bean.isGuest()) {
	    UserCredentials cred = entity.getCredentials();
	    if (cred == null) {
		cred = new UserCredentials();
		cred.setLogin(bean.getLogin());
		cred.setPassword(password);
		entity.setCredentials(cred);
	    }else cred.setPassword(password);
	}

	return entity;
    }
}
